ffmpeg 您所在的位置:网站首页 nvidia解码 ffmpeg open 崩溃 ffmpeg

ffmpeg

2024-06-29 23:21| 来源: 网络整理| 查看: 265

最近我将ffmpeg从0.9升级到1.0(在Win7x64和iOS上测试),现在avcodec_decode_video2seagfaults。长话短说:每次视频尺寸发生变化(例如从 320x240 到 160x120 或反之亦然)时,都会发生崩溃。

我从某些专有源接收 mpeg4 视频流并按如下方式对其进行解码:

// once, during initialization: AVCodec *codec_ = avcodec_find_decoder(CODEC_ID_MPEG4); AVCodecContext ctx_ = avcodec_alloc_context3(codec_); avcodec_open2(ctx_, codec_, 0); AVPacket packet_; av_init_packet(&packet_); AVFrame picture_ = avcodec_alloc_frame(); // on every frame: int got_picture; packet_.size = size; packet_.data = (uint8_t *)buffer; avcodec_decode_video2(ctx_, picture_, &got_picture, &packet_);

同样,在我升级到 1.0 之前,上述所有操作都完美无缺。现在,每当帧尺寸发生变化时,avcodec_decode_video2就会崩溃。请注意,我没有在 AVCodecContext 中分配宽度/高度 - 无论是在开始时,还是在流更改时 - 这可能是原因吗?

如果有任何想法,我将不胜感激!

更新:设置 ctx_.width 和 ctx_.height 没有帮助。

更新2:在崩溃之前我收到以下日志消息:

mpeg4, level 24: "Found 2 unreleased buffers!". level 8: "Assertion i < avci->buffer_count failed at libavcodec/utils.c:603"

Update3 升级到 1.1.2 修复了此崩溃。解码器再次能够应对动态尺寸变化。

最佳答案

您可以尝试填充AVPacket::side_data。如果更改帧大小,编解码器会从中接收信息(请参阅libavcodec/utils.c apply_param_change函数)

该结构可以按如下方式填充:

int my_ff_add_param_change(AVPacket *pkt, int32_t width, int32_t height) { uint32_t flags = 0; int size = 4 * 3; uint8_t *data; if (!pkt) return AVERROR(EINVAL); flags = AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS; data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size); if (!data) return AVERROR(ENOMEM); ((uint32_t*)data)[0] = flags; ((uint32_t*)data)[1] = width; ((uint32_t*)data)[2] = height; return 0; }

每次大小变化时都需要调用此函数。

我认为这个功能最近才出现。直到我查看新的 ffmpeg 源代码时我才知道这一点。

UPD

正如您所写,解决问题的最简单方法是重新启动编解码器。只需调用 avcodec_close/avcodec_open2

关于ffmpeg - ffmpeg 升级后解码器崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688992/



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有